/**
 * 手写 new 
 * @returns obj
 */
// function mynew() {
//     // 1. 新建一个实例对象
//     let obj = {};
//     // 2. 获得构造函数  
//     let con = Array.prototype.shift.call(arguments);
//     // 3. 链接原型  
//     obj.__proto__ = con.prototype;
//     // 4. 绑定this，执行构造函数
//     let res = con.apply(obj,arguments)
//     // 5. 返回新对象
//     return typeof res === 'object'?res:obj;
// }

function mynew(Func, ...args) {
    // 1.创建一个新对象
    const obj = {}
    // 2.新对象原型指向构造函数原型对象
    obj.__proto__ = Func.prototype
    // 3.将构建函数的this指向新对象
    let result = Func.apply(obj, args)
    // 4.根据返回值判断
    return result instanceof Object ? result : obj
}

// 测试
function Cat() {
    this.name ='cat';
    this.age = 10;
}

// 通过new调用的构造函数如果有返回值，值为基本数据类型，则不起作用this仍然指向实例对象；
//      如果值为对象，则return生效，this指向返回对象
// const mycat = new Cat();
const mycat = mynew(Cat)
console.log(mycat instanceof Cat) // true
console.log(mycat.name)  // cat